package com.cqie.service.impl;

import com.cqie.dto.user.PatientInfoDto;
import com.cqie.dto.TokenUserLoginDto;
import com.cqie.entity.PatientInfo;
import com.cqie.mapper.user.PatientInfoMapper;
import com.cqie.service.IPatientInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cqie.threadlocal.UserThreadLocal;
import com.cqie.util.RedisUtils;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 不吃海鲜
 * @since 2024-11-27
 */
@Service
@Slf4j
public class PatientInfoServiceImpl extends ServiceImpl<PatientInfoMapper, PatientInfo> implements IPatientInfoService {

    @Resource
    private PatientInfoMapper patientInfoMapper;

    private final RedisUtils redisUtils;

    public PatientInfoServiceImpl(RedisUtils redisUtils) {
        this.redisUtils = redisUtils;
    }

    /**
     * 获取患者个人信息
     * @return
     */
    @Override
    public PatientInfoDto getPatientInfo() {
        // 获取登陆账号信息
        TokenUserLoginDto tokenDto = UserThreadLocal.get(TokenUserLoginDto.class);
        // 根据登陆账号信息获取患者信息
        var patientInfo = patientInfoMapper.getPatientInfo(tokenDto.getPatientId());

        if (ObjectUtils.isEmpty(patientInfo)){
            return null;
        }

        PatientInfoDto patientInfoDto = new PatientInfoDto();

        BeanUtils.copyProperties(patientInfo, patientInfoDto);

        return patientInfoDto;
    }

    /**
     * 新增 / 更新 患者个人信息
     * @param patientInfoDto
     * @return
     */
    @Override
    public Boolean savePatientInfo(PatientInfoDto patientInfoDto) {
        // 获取登陆账号信息
        TokenUserLoginDto tokenDto = UserThreadLocal.get(TokenUserLoginDto.class);

        // 判断是否为更新
        var isPatientInfo = patientInfoMapper.getPatientInfo(tokenDto.getPatientId());

        PatientInfo patientInfo = PatientInfo.builder()
                .patientId(tokenDto.getPatientId())
                .patientIdCard(patientInfoDto.getPatientIdCard())
                .patientName(patientInfoDto.getPatientName())
                .patientSexName(patientInfoDto.getPatientSexName())
                .patientName(patientInfoDto.getPatientName())
                .build();

        // 新增
        if (ObjectUtils.isEmpty(isPatientInfo)){
            patientInfoMapper.insert(patientInfo);
        }
        // 更新
        else{
            patientInfo.setPatientInfoId(isPatientInfo.getPatientInfoId());
            patientInfoMapper.updateByPatientId(patientInfo);
        }
        return true;
    }

    @Override
    public PatientInfo getPatientInfoById(Integer patientId) {
        return patientInfoMapper.selectById(patientId);
    }
}
